Wie viele Komponenten hat ?
→ Gleich der Ordnung der DGL.
Vorgehen:
Schreiben Sie die folgende DGL in ein System von DGLn 1. Ordnung um.
Geben Sie auch die Anfangsbedingungen als Vektor an.
Gedämpfte Schwingung mit äußerer Anregung:
Wie viele Komponenten hat ?
Wir haben das Euler-Verfahren bereits kennengelernt – aber wie gut funktioniert es wirklich?
Testfall: Federschwinger ohne Dämpfung
Exakte Lösung: – eine gleichmäßige Schwingung, keine wachsende Amplitude.
Frage: Was passiert, wenn wir die Schrittweite variieren?
f = @(t, z) [z(2); -z(1)]; % Federschwinger: z = [x; v]
dt = 0.001;
t = 0:dt:30;
z = zeros(2, length(t));
z(:,1) = [1; 0]; % x(0)=1, v(0)=0
for i = 1:length(t)-1
z(:,i+1) = z(:,i) + dt * f(t(i), z(:,i));
end
plot(t, z(1,:), t, cos(t), '--')
legend('Euler', 'Exakt'), grid on
→ Wir brauchen ein Verfahren, das genauer ist bei gleicher Schrittweite.
Euler nutzt nur die Steigung am Anfang des Intervalls:
→ Analogie: Rechteckregel aus der Numerischen Integration.
Modifiziertes Euler-Verfahren: Erst einen halben Schritt, Steigung dort auswerten, dann ganzen Schritt:
→ Analogie: Mittelpunktregel. Genauer als Euler, weil die Steigung in der Mitte repräsentativer ist.
RK3: Steigung am Anfang, in der Mitte und am Ende:
→ Gewichte – das ist die Simpsonregel (Analysis II / Keplersche Fassregel), angewendet auf die Steigungsfunktion .
RK4: Die Mitte wird zweimal ausgewertet – verbessert die Schätzung von :
Unser Euler-Code:
f = @(t, z) [z(2); -z(1)];
dt = 0.01;
t = 0:dt:20;
z = zeros(2, length(t));
z(:,1) = [1; 0];
for i = 1:length(t)-1
z(:,i+1) = z(:,i) + dt * f(t(i), z(:,i));
end
Dieser Code braucht nur drei Dinge: die DGL f, den Zeitbereich und die Anfangsbedingung.
→ Das Verfahren selbst lässt sich als Funktion kapseln:
function [t, z] = ode_euler(f, tspan, z0, dt)
t = tspan(1):dt:tspan(2);
z = zeros(length(z0), length(t)); % funktioniert für 1D und nD
z(:,1) = z0;
for i = 1:length(t)-1
z(:,i+1) = z(:,i) + dt * f(t(i), z(:,i));
end
end
tspan ist der Zeitbereich [t0, tend]f ist ein Function-Handleode45 in MATLABMATLAB löst DGLn in Standardform mit ode45 – der Name steht für Runge-Kutta der Ordnung 4/5:
ode45 passt automatisch an[t, y] = ode45(f, tspan, z0)
| Argument | Bedeutung | Beispiel |
|---|---|---|
f |
Function-Handle für | @(t,z) [z(2); -z(1)] |
tspan |
Zeitbereich [t0, tend] |
[0, 20] |
z0 |
Anfangsbedingung (Spaltenvektor) | [1; 0] |
t |
Zeitpunkte (Spaltenvektor) | |
y |
Lösungsmatrix: eine Spalte pro Variable | y(:,1) = , y(:,2) = |
ode45f = @(t, z) [z(2); -z(1)]; % z = [x; v]
[t, y] = ode45(f, [0, 20], [1; 0]);
plot(t, y(:,1), 'b', t, y(:,2), 'r')
legend('x(t)', 'v(t)')
xlabel('t'), grid on
y(:,1) enthält , y(:,2) enthält – eine Zeile pro Zeitpunkt.
ode45Lösen Sie die gedämpfte Schwingung aus der vorherigen Aufgabe numerisch:
mit , , , , .
f(t, z) in MATLABode45 für Was beobachten Sie im Langzeitverhalten?